package com.jie.commonlib.common

import android.content.Context
import android.os.Environment
import android.text.TextUtils
import com.blankj.utilcode.util.Utils
import java.io.File

/**
 * 文件夹管理工具类
 * @author jie
 */
object FolderManager {
    private const val IMAGE_DIR_NAME = "image"
    private const val VIDEO_DIR_NAME = "video"
    private const val DOWNLOAD_DIR_NAME = "download"

    /**
     * 获取缓存文件路径(一般存放临时缓存数据)（App内部文件夹地址）
     */
    val cacheDir: String
        get() {
            return Utils.getApp().cacheDir.path
        }

    /**
     * 获取缓存图片文件夹路径（App内部文件夹地址）
     */
    val cacheImageDir: String
        get() {
            val dirPath = cacheDir + File.separator + IMAGE_DIR_NAME
            createDir(dirPath)
            return dirPath
        }

    /**
     * 获取缓存视频文件夹路径（App内部文件夹地址）
     */
    val cacheVideoDir: String
        get() {
            val dirPath = cacheDir + File.separator + VIDEO_DIR_NAME
            createDir(dirPath)
            return dirPath
        }

    /**
     * 获取缓存文件下载路径（App内部文件夹地址）
     */
    val cacheDownloadDir: String
        get() {
            val dirPath = cacheDir + File.separator + DOWNLOAD_DIR_NAME
            createDir(dirPath)
            return dirPath
        }

    /**
     * 获取文件存储根路径(一般放一些长时间保存的数据)
     */
    val filesDir: String
        get() = getFilesDir(null)

    /**
     * 获取文件在存储根路径(一般放一些长时间保存的数据)
     * @param dirType 文件夹类型，可以为空
     */
    private fun getFilesDir(dirType: String?): String {
        var path: String
        val subDirName: String? = getSubDirName(dirType)
        var needAddSubDirName = true
        val context: Context = Utils.getApp()
        val externalFilesDir = context.getExternalFilesDir(dirType)
        if (externalFilesDir != null && externalFilesDir.exists()) {
            path = externalFilesDir.path
            needAddSubDirName = false
        } else {
            path = context.filesDir.path
        }
        if (needAddSubDirName && !TextUtils.isEmpty(subDirName)) {
            path += File.separator + subDirName
        }
        createDir(path)
        return path
    }

    /**
     * 根据文件类型来获取对应的文件夹地址，为了和原来的文件夹地址保持一致
     */
    private fun getSubDirName(dirType: String?): String? {
        return if (!TextUtils.isEmpty(dirType)) {
            if (Environment.DIRECTORY_PICTURES == dirType || Environment.DIRECTORY_DCIM == dirType) {
                IMAGE_DIR_NAME
            } else if (Environment.DIRECTORY_DOWNLOADS == dirType) {
                DOWNLOAD_DIR_NAME
            } else if (Environment.DIRECTORY_MOVIES == dirType) {
                VIDEO_DIR_NAME
            } else {
                dirType!!.lowercase()
            }
        } else null
    }

    /**
     * 获取文件下载的文件夹地址
     * android10及以上系统，保存在App内部下载文件夹位置，用户不可见
     * android10以下系统，保存在系统SD卡指定位置，用户可以找到
     */
    @JvmStatic
    val downloadPath: String
        get() {
            val downloadDir = getFilesDir(Environment.DIRECTORY_DOWNLOADS)
            createDir(downloadDir)
            return downloadDir
        }

    /**
     * 获取图片文件存放在SD卡中的路径
     * android10及以上系统，保存在App内部下载文件夹位置，用户不可见
     * android10以下系统，保存在系统SD卡指定位置，用户可以找到
     */
    val imageDir: String
        get() {
            val imageDir = getFilesDir(Environment.DIRECTORY_PICTURES)
            createDir(imageDir)
            return imageDir
        }

    /**
     * 创建文件夹
     * @param dirPath 文件夹路径
     */
    private fun createDir(dirPath: String) {
        val file = File(dirPath)
        if (!file.exists()) {
            file.mkdirs()
        }
    }
}